// 自定义指令，权限
import store from '@/store';
import { hasPermissionHandle } from '@/config/permission';

// binding.val
// - 权限类型；config/permission.js@HANDLES
// - 二种格式：
//   1. 字符串，如 v-permission="'trade'"
//   2. 数组：如 v-permission="['trade', 'operate']"
// - 修饰符 modifiers：
//   1. disabled，没有权限时不隐藏，而是失效 v-permission.disabled
//   2. current，校验全部角色，还是当前角色 v-permission.current
//   2. dynamic，是否是动态权限 v-permission.dynamic
// - 参数 arg:
//   1. any，包含任意一个，数组格式 v-permission:any
//   2. exclude，不包含，字符串或数组 v-permission:exclude
// - 注：同时有参数和修饰符时，参数在前，如 v-permission:any.current.disabled
function vPermission (el, binding, vnode, oldVnode) {
  // binding.value为指令的绑定值
  const value = binding.value;
  const modifiers = binding.modifiers;
  const arg = binding.arg;

  const isArray = Array.isArray(value);
  const isString = typeof value === 'string';
  const isDisabled = modifiers.disabled;
  const isCurrent = modifiers.current;
  const isDynamic = modifiers.dynamic;
  if (!isArray && !isString) return;

  // 从store中获取当前用户全部角色
  const rolesName = store.getters.rolesName;
  const currentRole = store.getters.currentRole;
  const argRoleName = isCurrent ? currentRole : rolesName;
  const hasPermission = hasPermissionHandle(argRoleName, value, arg, isDynamic);

  // 没有权限时，对元素进行隐藏
  if (!hasPermission) {
    if (isDisabled) {
      vnode.componentInstance.disabled = true;
      el.disabled = true;
      el.classList.add('is-disabled');
    } else {
      el.parentNode && el.parentNode.removeChild(el);
    }
  }
}

export default {
  inserted: vPermission,
  update: vPermission
};
